<script>
    (async function () {
        // ================================ 缓存配置 ================================
        // 1. 安全获取配置
        // - 通过 Hugo 模板注入数据，不会暴露在window对象上
        // - 使用更安全的 index 函数
        // - 配合 default 函数提供回退值
        // - 使用 jsonify 函数确保数据是 JSON 格式
        const rawCacheConfig = "{{ default dict (index .Site.Data "cacheConfig") | jsonify }}";

        // 2. 封装私有配置
        const configStore = (function () {
            const _config = JSON.parse(rawCacheConfig);
            return {
                get: (path) => {
                    const keys = path.split('.');
                    return keys.reduce((obj, key) =>
                            (obj && obj[key] !== undefined ? obj[key] : null),
                        _config
                    );
                }
            };
        })();

        // 3. 安全暴露接口
        window.__cacheConfig = Object.freeze({
            getSetting: (path) => {
                const value = configStore.get(path);
                return value ? structuredClone(value) : null; // 深拷贝
            }
        });
    })();
</script>

<script type="module">
    // 必须在模块最顶层导入, 否则会报错
    import { ConfigEncryptor } from '/js/secure/config-encryptor.js';

    (async function () {
        // ================================ 天气配置 ================================
        // 1. 尝试从缓存读取
        const cached = sessionStorage.getItem('weatherConfig');

        // 2. 无缓存或失效时重新生成
        if (!cached || location.search.includes('forceRefresh')) {
            const weatherConfig = JSON.parse(`
                {{/* 1. 从配置文件获取配置 */}}
                {{ $config := default dict (index .Site.Data "weatherConfig") }}
                {{/* 2. 从环境变量获取配置 */}}
                {{ $envConfig := dict
                    "default" (dict
                        "projectId"     (getenv "QWEATHER_PROJECT_ID")
                        "credentialId"  (getenv "QWEATHER_CREDENTIAL_ID")
                        "apiEndpoint"   (getenv "QWEATHER_API_ENDPOINT")
                        "privateKeyJwk" (dict
                            "d" (getenv "QWEATHER_JWK_D")
                            "x" (getenv "QWEATHER_JWK_X")
                        )
                    )
                }}

                {{/* 3. 深度合并 */}}
                {{ $merged := merge $config $envConfig }}
                {{ if and (index $config "default") (index $envConfig "default") }}
                    {{ $merged := merge $merged (dict "default" (merge
                        (index $config "default")
                        (index $envConfig "default")
                    )) }}
                {{ end }}
                {{ $merged | jsonify }}
            `);
            // 环境变量注入 + 页面特征混合生成加密密码，实现不同页面使用不同密钥，绑定域名防止密钥复用
            const BASE_KEY = "{{ getenv "QWEATHER_ENCRYPT_BASE" | default "onenavisgood" }}";   // 通过CI/CD注入
            const SITE_ID = "{{ .Site.Home.Permalink | md5 }}";                                 // 站点唯一标识
            const ENCRYPTION_PASSWORD = `${BASE_KEY}:${SITE_ID}:${location.hostname}`;

            // 加密配置
            const encryptedConfig = await ConfigEncryptor.encrypt(
                weatherConfig.default,
                ENCRYPTION_PASSWORD
            );

            // 浏览器存储（Session级）
            sessionStorage.setItem('weatherConfig', JSON.stringify(encryptedConfig));
            sessionStorage.setItem('encryptionPassword', ENCRYPTION_PASSWORD);
        }

        // 显式挂载到 window 对象上
        window.__weatherConfig = Object.freeze({
            getSetting: () => structuredClone(JSON.parse(sessionStorage.getItem('weatherConfig')))
        });

        // 派发事件通知其他模块
        window.dispatchEvent(new CustomEvent('weatherConfigReady'));
    })();
</script>